//
//  CXStatusListViewModel.swift
//  Project03-Weibo-swift
//
//  Created by w on 16/1/22.
//  Copyright © 2016年 w. All rights reserved.
//

import UIKit
import SDWebImage

class CXStatusListViewModel: NSObject {
    /// 视图模型引用模型，不再是控制器直接引用模型?--> 更好的办法是设置一个新的viewModel来负责每一个cell的构建逻辑，并提供后者对应的模型
    //TODO: 将模型类型换成新的ViewModel类型
    var statusArray: [CXStatusViewModel]?
    ///  修改该方法的参数 记录上拉 还是 下拉操作
    func loadStatuses(isPullup isPullup: Bool = false, finished: (isSuccess: Bool, count: Int) -> Void) {
        
        var maxId: Int64 = 0
        var sinceId: Int64 = 0
        //做上拉或者操作的时候 statusArray里面已经存在数据 需要进行更新
        if isPullup {
            //上拉操作.
            maxId = statusArray?.last?.status?.id ?? 0 //maxId默认为0
            if maxId != 0 {
                maxId--   //新浪官方的maxId是个闭区间 因此要避免重复
            }
        } else {
            sinceId = statusArray?.first?.status?.id ?? 0
        }
        
        //TODO: 数据库操作 读取本地数据，如果不存在，就从网上下载 然后缓存
        CXStatusDAL.loadData(sinceId: sinceId, maxId: maxId) { (result) -> Void in
            
            guard let resDict = result else {
                print("CXStatusDAL 数据加载失败")
                finished(isSuccess: false, count: 0)
                return
            }
            
            //进行字典转模型
            var tempArry = [CXStatusViewModel]()
            
                //刚开始时 为空
            if self.statusArray == nil {
                self.statusArray = [CXStatusViewModel]()
            }
            
            for dict in resDict {
                //将字典转模型 然后初始化视图模型 再把后者加入模型数组
                tempArry.append(CXStatusViewModel(status: CXStatus(dict: dict)))
            }
            
            //根据上拉或者下拉来拼接数据
            if isPullup {
                self.statusArray! += tempArry
            } else {
                self.statusArray = tempArry + self.statusArray!
            }
            //获取这一组数据，将数据缓存，获取其中只包含一个图片的status的图片大小
            
            //已经将数据下载完毕并赋值。在这里可以添加获取其中的图片尺寸的操作
            //finished(isSuccess: true)
            self.cacheSingleImage(tempArry, finished: finished)
        }
    }
}
//        //获取状态信息的微博后 回调给控制器 告知其是否成功
//        let accessToken = CXUserInfoViewModel.sharedUserModel.accessToken!
//        CXNetworkTool.sharedTool.loadHomeStatuses(accessToken, sinceId: sinceId, maxId: maxId) { (response, error) -> Void in
//            if error != nil {
//                print(error)
//                finished(isSuccess: false, count: 0)
//                return
//            } else {
//                
//                print("HomeStatus: \(response)")
//                
//                guard let responseDict = response as? [String: AnyObject] else {
//                    print("主页响应的字典格式不符")
//                    finished(isSuccess: false, count: 0)
//                    return
//                }
//                
//                let statusDict = responseDict["statuses"] as! [[String : AnyObject]]
//                
//                //进行字典转模型
//                var tempArry = [CXStatusViewModel]()
//                for dict in statusDict {
//                    //将字典转模型 然后初始化视图模型 再把后者加入模型数组
//                    tempArry.append(CXStatusViewModel(status: CXStatus(dict: dict)))
//                }
//                //刚开始时 为空
//                if self.statusArray == nil {
//                    self.statusArray = [CXStatusViewModel]()
//                }
//                //根据上拉或者下拉来拼接数据
//                if isPullup {
//                    self.statusArray! += tempArry
//                } else {
//                    self.statusArray = tempArry + self.statusArray!
//                }
//                //获取这一组数据，将数据缓存，获取其中只包含一个图片的status的图片大小
//                
//                
//                //已经将数据下载完毕并赋值。在这里可以添加获取其中的图片尺寸的操作
//                //finished(isSuccess: true)
//                self.cacheSingleImage(tempArry, finished: finished)
//            }
//        }
//    }
//}

extension CXStatusListViewModel {
    
    private func cacheSingleImage(imgVM:[CXStatusViewModel],finished: (isSuccess: Bool, count: Int) -> Void) {
        
        let group = dispatch_group_create()
        var dataLength = 0
        //在所有含有图片的ViewModel遍历完毕以后，回调block
        for datavm in imgVM {
            //如果含有一个图片。原创微博与转发微博二者只有一个有图片
            if let pic_urls = (datavm.status?.pic_urls?.count > 0 ? datavm.status?.pic_urls : datavm.status?.retweeted_status?.pic_urls) where pic_urls.count == 1 {
                
                let pic_url = pic_urls.first! //取唯一的一个元素
                
                dispatch_group_enter(group)
                //该方法自身带有缓存图片的功能.该操作是一个异步操作
                SDWebImageManager.sharedManager().downloadImageWithURL(NSURL(string: pic_url.thumbnail_pic!), options: [], progress: nil, completed: { (imgOne, _, _, _, url) -> Void in
                    print("cache url is : \(url)")
                    if imgOne != nil {
                        dataLength += UIImagePNGRepresentation(imgOne)!.length
                        //print("the img abount to cach is :\(imgOne.size)")
                    }
                    //完成下载和缓存操作 出队列
                    dispatch_group_leave(group)
                })
            }
        }
        //通知tableview去刷新数据.此时所有满足条件的cell的图片都已经缓存
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("cached sum of length is: \(dataLength)")
            finished(isSuccess: true, count: imgVM.count)
        }
    }
}
